package busterminal.persistence.jdbc.proxy;

import busterminal.entity.Bus;
import busterminal.entity.BusModel;
import busterminal.entity.service.PurposeType;
import busterminal.persistence.BusDAO;
import busterminal.services.ServiceLocator;

/**
 * Класс - заместитель автобуса
 */
public class BusProxy implements Bus {

    /**
     * Идентификатор объекта в базе данных
     */
    private int id;
    /**
     * Proxy-объект автобуса
     */
    private Bus proxyObject;

    /**
     * Конструктор по умолчанию
     */
    public BusProxy() {
    }

    /**
     * Параметризованный конструктор
     * @param id идентификатор объекта в базе данных
     */
    public BusProxy(int id) {
        this.id = id;
    }

    /**
     * Получить proxy-объект: если он не загружен, то загрузить и получить
     * @return proxy-объект
     */
    private Bus getProxy() {
        if (proxyObject == null) {
            proxyObject = ServiceLocator.getService(BusDAO.class).read(id);
        }
        return proxyObject;
    }

    /**
     * Получить идентификатор
     * @return идентификатор
     */
    @Override
    public Integer getId() {
        return id;
    }

    /**
     * Установить идентификатор
     * @param id идентификатор
     */
    @Override
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Получить модель автобуса
     * @return модель автобуса
     */
    @Override
    public BusModel getBusModel() {
        return getProxy().getBusModel();
    }

    /**
     * Установить модель автобуса
     * @param busModel модель автобуса
     */
    @Override
    public void setBusModel(BusModel busModel) {
        getProxy().setBusModel(busModel);
    }

    /**
     * Получить назначение автобуса, определяемое константой из {@link PurposeType}
     * @return назначение автобуса, определяемое константой из {@link PurposeType}
     */
    @Override
    public PurposeType getPurposeType() {
        return getProxy().getPurposeType();
    }

    /**
     * Установить назначение автобуса, определяемое константой из {@link PurposeType}
     * @param purposeType назначение автобуса, определяемое константой из {@link PurposeType}
     */
    @Override
    public void setPurposeType(PurposeType purposeType) {
        getProxy().setPurposeType(purposeType);
    }

    /**
     * Получить год начала эксплуатации
     * @return год начала эксплуатации
     */
    @Override
    public int getStartYearOfExploitation() {
        return getProxy().getStartYearOfExploitation();
    }

    /**
     * Установить год начала эксплуатации
     * @param startYearOfExploitation год начала эксплуатации
     */
    @Override
    public void setStartYearOfExploitation(int startYearOfExploitation) {
        getProxy().setStartYearOfExploitation(startYearOfExploitation);
    }

    /**
     * Получить государственный номер
     * @return государственный номер
     */
    @Override
    public String getStateNumber() {
        return getProxy().getStateNumber();
    }

    /**
     * Установить государственный номер
     * @param stateNumber государственный номер
     */
    @Override
    public void setStateNumber(String stateNumber) {
        getProxy().setStateNumber(stateNumber);
    }

    /**
     * Метод, возвращающий текстовое представление объекта
     * @return текстовое представление объекта
     */
    @Override
    public String toString() {
        return "BusProxy{" + "id=" + id + ", proxyObject=" + getProxy() + '}';
    }
}
